package com.stark.commons.spring.core.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

/**
 * 与 Spring 相关的公共方法集合。
 * @author Ben
 * @since 1.0.0
 * @version 1.0.0
 * @see com.stark.commons.lang.util.Utils
 */
public class Utils extends com.stark.commons.lang.util.Utils {
	
	/**
	 * 获取 classpath 目录下文件读取器。
	 * @param path 相对于 classpath 的文件路径。
	 * @param charsetName 文件字符集。
	 * @return {@link InputStreamReader}
	 * @throws IOException 未找到指定文件时抛出异常。
	 */
	public static InputStreamReader getClasspathFileReader(String path, String charsetName) throws IOException {
		PathMatchingResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();  
	    Resource[] resources = patternResolver.getResources(path);
	    if (ArrayUtils.isEmpty(resources)) {
	    	throw new FileNotFoundException("未找到指定文件：path=" + path);
	    }
	    
        InputStreamReader reader = new InputStreamReader(resources[0].getInputStream(), charsetName);
        return reader;
	}
	
	/**
	 * 读取 classpath 目录下文件内容。
	 * @param path 相对于 classpath 的文件路径。
	 * @param charsetName 文件字符集。
	 * @return 文件内容。
	 * @throws IOException 未找到指定文件时抛出异常。
	 */
	public static String catClasspathFile(String path, String charsetName) throws IOException {
        InputStreamReader reader = getClasspathFileReader(path, charsetName);
        String content = IOUtils.toString(reader);
        return content;
	}
	
	/**
	 * 把 classpath 中的文件写到磁盘。
	 * @param diskDir 磁盘目录，默认 "java.io.tmpdir" 。
	 * @param classpath 以 "classpath:" 开头的路径，如 "classpath:application.yml" 。
	 * @return 磁盘绝对路径。
	 * @throws IOException 写文件到磁盘时出错。
	 */
	public static String classpath2disk(String diskDir, String classpath) throws IOException {
		if (StringUtils.isBlank(classpath) || !classpath.startsWith("classpath:")) {
			return classpath;
		}
		
		if (StringUtils.isBlank(diskDir) || "java.io.tmpdir".equals(diskDir)) {
			diskDir = System.getProperty("java.io.tmpdir");
		}
		Resource resource = new ClassPathResource(StringUtils.substringAfter(classpath, "classpath:"));
		String filename = StringUtils.substringAfterLast(classpath, classpath.contains("/") ? "/" : "classpath:");
		String destPath = diskDir + (diskDir.endsWith(File.separator) ? "" : File.separator) + filename;
		Files.copy(resource.getInputStream(), new File(destPath).toPath(), StandardCopyOption.REPLACE_EXISTING);
		return destPath;
	}
	
}
